#include "GlobalHeader.h"
#include "StdSem.h"

// void SemPV(int semID, int op)
// {
//     struct sembuf semb;
//     semb.sem_num = 0;
//     semb.sem_op = op;
//     semb.sem_flg = SEM_UNDO;
//     semop(semID,&semb,1);
// }

void SignalHanlder(int sig)
{
    exit(1);
}

int semID = 0;
void RemoveSem()
{
    printf("退出删除信号量：\n");
    //删除信号量
    //semctl(semID,0,IPC_RMID,NULL);
    //ClearSem(s);
}

int main()
{
    atexit(RemoveSem);
    signal(SIGINT,SignalHanlder);

    // // 获取信号量
    // // 获取IPC键值
    // key_t key = ftok("./",2);
    // if(key < 0)
    // {
    //     perror("ftok");
    //     return -1;
    // }

    // //信号量ID,IPC键值、信号量数量、权限
    // int semID = semget(key,1,IPC_CREAT | 0777);
    // if(semID < 0)
    // {
    //     perror("SEMGET");
    //     return -1;
    // }

    // //信号量控制，0下标,设定信号量值为1
    // if(semctl(semID,0,SETVAL,1) < 0)
    // {
    //     perror("semctl");
    //     return -1;
    // }

    Sem *s = InitSem("./",2);
    pid_t pid = fork();
    if(pid < 0)
        return -1;
    if(pid == 0)
    {
        while(1)
        {
            //SemPV(semID,-1);
            Semp(s);
            printf("子进程进入睡眠\n");
            //挂起进程
            sleep(1);
            printf("子进程醒来!\n");
            //SemPV(semID,1);
            Semv(s);
        }
    }
    else
    {
        while(1)
        {
            //SemPV(semID,-1);
            Semp(s);
            printf("父进程进入睡眠\n");
            sleep(1);
            printf("父进程醒来!\n");
            //SemPV(semID,1);
            Semv(s);
        }
    }

    //删除信号量
    //semctl(semID,0,IPC_RMID,NULL);
    ClearSem(s);
    return 0;
}